//
// Created by Crazy.Mo on 2018/9/7.
//
#include <pthread.h>
#include <android/log.h>
#include <queue>
#include <jni.h>

using namespace std;

#define  LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"CrazyMoJNI",__VA_ARGS__);

queue<int> q;
static pthread_mutex_t mutex;//定义互斥锁
void *pop(void* args) {
    //线程未同步导致的多线程安全问题可能会有重复的数据取出并出现异常
    // 占有锁
    pthread_mutex_lock(&mutex);
    if (!q.empty())
    {
        LOGE("子线程取出数据:%d\n", q.front());
        q.pop();
    }
    else {
        LOGE("无数据\n");
    }
    // 释放锁
    pthread_mutex_unlock(&mutex);
    return 0;
}

extern "C"
JNIEXPORT jint JNICALL
Java_com_crazymo_ndk_jni_JNIHelper_testUnSync(JNIEnv *env, jobject instance)
{
    //初始化互斥锁，这只是一种形式
    pthread_mutex_init(&mutex, 0);
    for (size_t i = 0; i < 5; i++)
    {
        q.push(i);
    }
    pthread_t pid[10];
    for (size_t i = 0; i < 10; i++)
    {
        pthread_create(&pid[i], 0, pop, &q);//创建Native线程
    }
    //需要释放
    for (size_t i = 0; i < 10; i++)
    {
        pthread_join(pid[i], 0);
    }
    pthread_mutex_destroy(&mutex);
    return 0;
}
